.mod-global.global-setting
    tabset.mod-tab
        tab(heading="用户管理" active="vm.tabActive[0].active" ui-sref="globalSetting.userinfo")
            .user-list-title
                input.ui-input-fill.ui-input-search.pull-right(placeholder="输入用户名称查找" ng-model="vm.key.userKey")
                h3 用户列表
                .com-select-con(select-con)
                    button.ui-btn.ui-btn-select.ui-btn-white(ng-cloak)
                        i.icon-down
                        | {{vm.currentUserType.type=='USER'?'普通用户':vm.currentUserType.type}}
                    ul.select-list
                        li.select-item
                            a(ng-click="vm.toggleUserType('LDAP');") LDAP
                        li.select-item
                            a(ng-click="vm.toggleUserType('USER');") 普通用户
                .to-add(ng-if="vm.currentUserType.type=='USER'")
                    button.ui-btn.ui-btn-primary.ui-btn-sm(ng-if="!vm.isShowAdd" ng-click="vm.toggleShowAdd()") 创建用户
                        i.icon-down-white.up
                    button.ui-btn.ui-btn-primary.ui-btn-sm(ng-if="vm.isShowAdd" ng-click="vm.toggleShowAdd()") 取消
                        i.icon-down-white
            ul.com-list-info.add-user(ng-form name="userForm" role="form" ng-class="{'need-valid':vm.needValidUser.valid}" ng-show="vm.isShowAdd")
                li
                    span.info-name 用户名
                    .info-content
                        input.ui-input-white.line-single(placeholder="由小写字母和数字组成" name="newuser" ng-model="vm.newUser.username" is-user-exist="vm.userList" required ng-pattern="/^[0-9a-z]+$/")
                        span.txt-error(ng-if="(vm.needValidUser.valid||userForm.newuser.$dirty)&&userForm.newuser.$error.pattern") 非法的名称
                        span.txt-error(ng-if="(vm.needValidUser.valid||userForm.newuser.$dirty)&&userForm.newuser.$error.isUserExist") 用户已存在
                li
                    span.info-name 密码
                    .info-content
                        input.ui-input-white.line-single(placeholder="8-20位" type="password" ng-model="vm.newUser.password" name="newpw"  ng-model-options="{updateOn:'default blur',debounce:{default:500,blur:0}}" required ng-minlength="8" ng-maxlength="20")
                        span.txt-error(ng-if="(vm.needValidUser.valid||userForm.newpw.$dirty)&&(userForm.newpw.$error.minlength||userForm.newpw.$error.maxlength)") 长度必须为8-20位
                li
                    span.info-name 再次输入密码
                    .info-content
                        input.ui-input-white.line-single(placeholder="重新输入密码" type="password" ng-model="vm.newUser.rePassword" name="password"  ng-model-options="{updateOn:'default blur',debounce:{default:500,blur:0}}" required equal="newUser.password")
                        span.txt-error(ng-if="(vm.needValidUser.valid||userForm.password.$dirty)&&userForm.password.$error.equal") 两次密码不一致
                li
                    span.info-name 邮箱
                    .info-content
                        input.ui-input-white.line-single( ng-model="vm.newUser.email" name="email" required)
                li
                    span.info-name 电话
                    .info-content
                        input.ui-input-white.line-single( ng-model="vm.newUser.phone" name="phone")
                        .txt-wrap
                            button.ui-btn.ui-btn-primary.ui-btn-sm(ng-click="vm.needValidUser.valid=true;userForm.$valid&&vm.addUser(userForm);") 确认创建

            //- table.ui-table-dome.full.table-userlist(ng-if="currentUserType.type=='LDAP'")
                thead
                    tr
                        th 用户名
                tbody
                    tr(ng-if="!ldapUserList||userListFiltered1.length===0")
                        td 无相关用户信息
                    tr(ng-repeat="user in userListFiltered1=(ldapUserList|filter:{'username':userKey.key})")
                        td(ng-bind="user.username")
            table.ui-table-dome.full.table-userlist
                thead
                    tr
                        th 用户名
                        th 邮箱
                        th 电话
                        th 操作
                tbody
                    tr(ng-if="!vm.userList||userFiltered.length===0")
                        td(colspan="3") 无相关用户信息
                    tr(ng-repeat="user in userFiltered=(vm.userList|filter:{'username':vm.key.userKey,'loginType':vm.currentUserType.type})")
                        td(ng-bind="user.username")
                        td
                            span.useremail.tool-nowrap(ng-bind="user.email||'未设置'")
                        td
                            span.useremail.tool-nowrap(ng-bind="user.phone||'未设置'")
                            //- span(ng-if="!user.isEdit")
                                span.useremail.tool-nowrap(ng-bind="user.email")
                                a.icon-edit(ng-click="vm.userListIns.toggleEdit(user,true)")
                            //- span(ng-if="user.isEdit")
                                input.useremail.ui-input-white(ng-model="vm.user.newEmail")
                                button.ui-btn.ui-btn-primary.ui-btn-sm(ng-click="vm.userListIns.saveSingle(user)") 保存
                                button.ui-btn.ui-btn-white.ui-btn-sm(ng-click="vm.userListIns.toggleEdit(user,false)") 取消
                        td
                            button.ui-btn.ui-btn-primary.ui-btn-sm(ng-click="vm.modifyPw(user)" ng-if="vm.currentUserType.type=='USER'") 修改密码
                            a.icon-edit(ng-click="vm.modifyUserInfo(user)")
                            a.icon-delete(ng-click="vm.deleteUser(user)" ng-if="user.username!='admin'")
        tab(heading="LDAP" ng-click="vm.getLdap()" active="vm.tabActive[1].active" ui-sref="globalSetting.ldapinfo")
            ul.com-list-info.ldap-info(ng-form name="ladpForm" ng-class="{'need-valid':vm.needValidLdap}")
                li
                    span.info-name OpenLDAP服务器地址
                    .info-content
                        input.ui-input-white.line-single(placeholder="IP或域名" name="ladpUrl" ng-model="vm.ldapInfo.url" required ng-pattern="/^[^\\s]*$/")
                        input.ui-input-white.line-single(placeholder="端口，如：389" name="ladpPort" ng-model="vm.ldapInfo.port" required ng-pattern="/^[^\\s]*$/")
                li
                    span.info-name email后缀
                    .info-content
                        input.ui-input-white.line-single(ng-model="vm.ldapInfo.emailSuffix" name="ladpEmail" ng-pattern="/^[^\\s]*$/")
            .com-bottom-option
                button.ui-btn.ui-btn-bright.ui-btn-md(ng-click="vm.needValidLdap=true;ladpForm.$valid&&vm.saveLdap()") 保存配置
                //- button.ui-btn.ui-btn-safe.ui-btn-md 验证当前配置
        tab(heading="代码仓库" ng-click="vm.getGitInfo()" active="vm.tabActive[2].active" ui-sref="globalSetting.gitinfo")
            ul.com-list-info(ng-form name="gitForm" ng-class="{'need-valid':vm.needValidGit}")
                li
                    span.info-name 选择类型
                    .info-content.com-chose-repository
                        span.repository.active
                            i.icon-gitlab
                            | GitLab
                        p.txt-prompt 每种类型可分别配置一个代码仓库
                li
                    span.info-name 代码仓库地址
                    .info-content
                        input.ui-input-white.line-single(ng-model="vm.gitInfo.url" name="gitUrl" required ng-pattern="/^[^\\s]*$/")
            .com-bottom-option
                button.ui-btn.ui-btn-bright.ui-btn-md(ng-click="vm.needValidGit=true;gitForm.$valid&&vm.saveGit()") 保存配置
        tab(heading="私有仓库" ng-click="vm.getRegistryInfo()" active="vm.tabActive[3].active" ui-sref="globalSetting.registryinfo")
            ul.com-list-info(ng-form name="registryForm" ng-class="{'need-valid':vm.needValidRegistry}")
                li
                    span.info-name 私有仓库地址
                    .info-content
                        input.ui-input-white.line-single(ng-model="vm.registryInfo.url" name="registryUrl" required ng-pattern="/^[^\\s]*$/" style="display:inline-block")
                        span
                            input.ui-check(type="checkbox" name="isHttps" id="isHttps" ng-model="vm.registryInfo.status" ng-true-value="1" ng-false-value="0")
                            label(for="isHttps") https
                li
                    span.info-name 描述
                    .info-content
                        input.ui-input-white.line-single(ng-model="vm.registryInfo.description")
                li(ng-if="vm.registryInfo.status===1")
                    span.info-name 证书信息
                    .info-content
                        textarea.ui-input-white.line-single.certification-txt(ng-model="vm.registryInfo.certification" placeholder="请将证书文本粘贴至文本框")
            .com-bottom-option
                button.ui-btn.ui-btn-bright.ui-btn-md(ng-click="vm.needValidRegistry=true;registryForm.$valid&&vm.saveRegistry()") 保存配置
        tab(heading="服务器" ng-click="vm.getServerInfo()" active="vm.tabActive[4].active" ui-sref="globalSetting.serverinfo")
            ul.com-list-info(ng-form name="serverForm" ng-class="{'need-valid':vm.needValidServer}")
                li
                    span.info-name.not-align-input 服务器地址
                    .info-content
                        span.txt-prompt DomeOS API服务器访问地址
                        input.ui-input-white.line-single(placeholder="https协议url请用“https://”开头" ng-model="vm.serverInfo.url" name="serverUrl" required ng-pattern="/^[^\\s]*$/")
            .com-bottom-option
                button.ui-btn.ui-btn-bright.ui-btn-md(ng-click="vm.needValidServer=true;serverForm.$valid&&vm.saveServer()") 保存配置
        tab(heading="监控报警" ng-click="vm.getMonitorInfo()" active="vm.tabActive[5].active" ui-sref="globalSetting.monitorinfo")
            ul.com-list-info(ng-form name="monitorForm" ng-class="{'need-valid':vm.needValidMonitor}")
                //- li
                //-     span.info-name 监控控制台地址
                //-     .info-content
                //-         input.ui-input-white.line-single(placeholder="https协议url请用“https://”开头" name="serverUrl" ng-model="vm.monitorConfig.url" required ng-pattern="/^[^\\s]*$/")
                li
                    span.info-name.not-align-input transfer
                    .info-content
                        span.txt-prompt 监控数据转发组件
                        .line-single(ng-repeat="tansfer in vm.monitorConfig.transfer")
                            input.ui-input-white.full(placeholder="请输入ip：port" name="serverUrl" ng-model="tansfer.text" ng-focus="$last&&vm.monitorIns.addItem('transfer')")
                            .txt-wrap(ng-if="vm.monitorConfig.transfer.length>1")
                                a.icon-delete(ng-click="vm.monitorIns.deleteArrItem('transfer',$index)")
                li
                    span.info-name.not-align-input graph
                    .info-content
                        span.txt-prompt 监控数据存储组件
                        .line-single(ng-repeat="graph in vm.monitorConfig.graph")
                            input.ui-input-white.full(placeholder="请输入ip：port" name="serverUrl" ng-model="graph.text" ng-focus="$last&&vm.monitorIns.addItem('graph')")
                            .txt-wrap(ng-if="vm.monitorConfig.graph.length>1")
                                a.icon-delete(ng-click="vm.monitorIns.deleteArrItem('graph',$index)")
                li
                    span.info-name.not-align-input query
                    .info-content
                        span.txt-prompt 监控数据查询组件
                        .line-single
                            input.ui-input-white.full(placeholder="请输入ip：port" name="query" ng-model="vm.monitorConfig.query")
                li
                    span.info-name.not-align-input hbs
                    .info-content
                        span.txt-prompt 监控心跳服务器组件
                        .line-single
                            input.ui-input-white.full(placeholder="请输入ip：port" name="hbs" ng-model="vm.monitorConfig.hbs")
                li
                    span.info-name.not-align-input judge
                    .info-content
                        span.txt-prompt 报警判断组件
                        .line-single(ng-repeat="judge in vm.monitorConfig.judge")
                            input.ui-input-white.full(placeholder="请输入ip：port" name="judge" ng-model="judge.text" ng-focus="$last&&vm.monitorIns.addItem('judge')")
                            .txt-wrap(ng-if="vm.monitorConfig.judge.length>1")
                                a.icon-delete(ng-click="vm.monitorIns.deleteArrItem('judge',$index)")
                li
                    span.info-name.not-align-input alarm
                    .info-content
                        span.txt-prompt 报警事件处理组件
                        .line-single
                            input.ui-input-white.full(placeholder="请输入ip：port" name="alarm" ng-model="vm.monitorConfig.alarm")
                li
                    span.info-name.not-align-input sender
                    .info-content
                        span.txt-prompt 报警发送组件
                        .line-single
                            input.ui-input-white.full(placeholder="请输入ip：port" name="sender" ng-model="vm.monitorConfig.sender")
                li
                    span.info-name.not-align-input nodata
                    .info-content
                        span.txt-prompt 报警假数据填充组件
                        .line-single
                            input.ui-input-white.full(placeholder="请输入ip：port" name="nodata" ng-model="vm.monitorConfig.nodata")
                li
                    span.info-name.not-align-input redis
                    .info-content
                        span.txt-prompt 报警redis组件
                        .line-single
                            input.ui-input-white.full(placeholder="请输入ip：port" name="redis" ng-model="vm.monitorConfig.redis")
                li
                    span.info-name.not-align-input apiSms
                    .info-content
                        span.txt-prompt 报警短信发送接口。请和使用的短信发送平台保持一致
                        .line-single
                            input.ui-input-white.full(placeholder="请输入url" name="apiSms" ng-model="vm.monitorConfig.apiSms")
                li
                    span.info-name.not-align-input apiMail
                    .info-content
                        span.txt-prompt 报警邮件发送接口。请和使用的邮件发送平台保持一致
                        .line-single
                            input.ui-input-white.full(placeholder="请输入url" name="apiMail" ng-model="vm.monitorConfig.apiMail")
            .com-bottom-option
                button.ui-btn.ui-btn-bright.ui-btn-md(ng-click="vm.needValidMonitor=true;monitorForm.$valid&&vm.saveMonitor()") 保存配置
        tab(heading="Web SSH" ng-click="vm.getWebSsh()" active="vm.tabActive[6].active" ui-sref="globalSetting.sshinfo")
            ul.com-list-info(ng-form name="sshForm" ng-class="{'need-valid':vm.needValidSsh}")
                li
                    span.info-name.not-align-input.webssh-txt Web SSH服务地址
                    .info-content
                        span.txt-prompt Web SSH登录服务访问地址（对应容器的访问地址）
                        input.ui-input-white.line-single(placeholder="请输入ip：port" name="sshUrl" ng-model="vm.sshInfo.url" required)
            .com-bottom-option
                button.ui-btn.ui-btn-bright.ui-btn-md(ng-click="vm.needValidSsh=true;sshForm.$valid&&vm.saveSsh()") 保存配置
        tab(heading="构建集群" ng-click="vm.initClusterInfo()" active="vm.tabActive[7].active" ui-sref="globalSetting.clusterinfo")
            loading(ng-if="vm.clusterLoadingIns.isLoading")
            button.ui-btn.ui-btn-bright.ui-btn-md.btn-cluster-save(ng-click="vm.needValidCluster=true;clusterForm.$valid&&vm.saveCluster()" ng-disabled="vm.clusterLoadingIns.isLoading") 保存配置
            span.cluster-detail DomeOS的构建任务都在构建集群上运行。构建任务包括项目构建和镜像定制功能。除了运行构建任务，构建集群也可以用于部署其他服务。
            ul.com-list-info(ng-form name="clusterForm" ng-class="{'need-valid':vm.needValidCluster}")
                li
                    span.info-name.not-align-input 选择集群
                    .info-content
                        span.txt-prompt 列表展示了“集群管理”中的所有集群，选择一个作为构建集群。
                        .com-select-con.line-single(select-con)
                            button.ui-btn-select.ui-btn.ui-btn-white
                                i.icon-down
                                | {{vm.clusterInfo.clusterName||'选择集群'}}
                            ul.select-list
                                li.select-item(ng-repeat="cluster in vm.clusterList")
                                    a(ng-bind="cluster.name" ng-click="vm.toggleCluster(cluster)")
                        input(type="hidden" ng-model="vm.clusterInfo.clusterName" required name="clusterName")
                        span.txt-error(ng-if="vm.needValidCluster&&clusterForm.clusterName.$invalid") 请选择集群
                li
                    span.info-name 选择namespace
                    .info-content
                        span.txt-prompt 在集群的namespace中选择一个，用于启动构建任务。
                        .com-select-con.line-single(select-con)
                            button.ui-btn-select.ui-btn.ui-btn-white
                                i.icon-down
                                | {{vm.clusterInfo.namespace||'选择namespace'}}
                            ul.select-list
                                li.select-item(ng-repeat="namespace in vm.namespaceList")
                                    a(ng-bind="namespace.name" ng-click="vm.clusterInfo.namespace = namespace.name")
                        input(type="hidden" ng-model="vm.clusterInfo.namespace" required name="namespace")
                        span.txt-error(ng-if="vm.needValidCluster&&clusterForm.namespace.$invalid") 请选择namespace
            .node-option
                span.host-right
                    | 共有{{nodelistFiltered.length}}台主机
                    input.ui-input.ui-input-search.ui-input-fill(placeholder="输入主机名查询" ng-model="vm.key.nodeKey")
                span.host-detail 构建集群的主机列表，构建任务会在开启“用于构建”的主机上运行，请确保构建集群内有至少一台主机能够用于构建。
            table.ui-table.ui-table-dome.table-hostlist
                thead
                    tr
                        th 主机名称
                        th IP
                        th CPU总量（个）
                        th 内存总量（MB）
                        th 运行实例（个）
                        th 状态
                        th 是否用于构建
                tbody
                    tr(ng-if="!vm.nodeList||nodelistFiltered.length===0")
                        td(colspan="7") 无相关信息
                    tr(ng-repeat="node in nodelistFiltered=(vm.nodeList|filter:{name:vm.key.nodeKey})")
                        td(ng-bind="node.name")
                        td(ng-bind="node.ip")
                        td(ng-bind="node.capacity.cpu")
                        td(ng-bind="node.capacity.memory")
                        td(ng-bind="node.runningPods")
                        td(ng-switch="node.status")
                            span(ng-switch-when="Ready").txt-safe 在线
                            span(ng-switch-default).txt-prompt 离线
                        td
                            dome-toggle(ng-class="{'on':node.isUsedByBuild}" ng-click="node.isUsedByBuild = !node.isUsedByBuild")
script(type="text/ng-template" id="newPasswdModal.html")
    .d-modal-header 修改密码
    .modal-body.text-center
        ul.modal-info(ng-form role="form" name="pwForm")
            li
                span.info-name 新密码
                .info-content.text-left
                    input.ui-input-white.full(placeholder="8-20位" type="password" name="newPassword" ng-model="vmPw.passwd" ng-model-options="{updateOn:'default blur',debounce:{default:500,blur:0}}" required ng-minlength="8" ng-maxlength="20")
                    span.txt-error(ng-if="pwForm.newPassword.$dirty&&(pwForm.newPassword.$error.minlength||pwForm.newPassword.$error.maxlength)") 长度必须为8-20位
    .modal-footer
        button.ui-btn.ui-btn-sm.ui-btn-white(ng-click="vmPw.cancel()") 取消
        button.ui-btn.ui-btn-sm.ui-btn-safe(ng-click="pwForm.$valid&&vmPw.subPw()") 确定